package br.org.acessobrasil.portal.persistencia;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;

@Transactional
public class UsuarioDaoSpring extends SuperDao<Usuario>{
	private static Logger logger = Logger.getLogger(UsuarioDaoSpring.class);

	private static UsuarioDaoSpring instance;
	
	public UsuarioDaoSpring() {
		logger.info("UsuarioDaoSpring instanciado");
		instance = this;
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getList() {
		Query query = getEntityManager().createQuery("select l FROM Usuario l");
		try{
			return query.getResultList(); 
		}catch(Exception e){
			return null;
		}	
	}

	public Usuario procura(String co_usuario) {
		Query query = getEntityManager().createQuery("select u FROM Usuario u where u.co_usuario=?");
		query.setParameter(1,co_usuario);
		try{
			return (Usuario) query.getSingleResult();	
		}catch(NoResultException e){
			return null;
		}
		
	}
	
	public Usuario select(Long nu_usuario) throws Exception {
		return getEntityManager().find(Usuario.class, nu_usuario);
	}

	public static UsuarioDaoSpring getInstance() {
		return instance;
	}

	public void apagar(long nu_usuario) throws Exception{
		Usuario u = select(nu_usuario);
			
		//TODO apagar arquivos? sgctb_arquivo
		
		//apagar relacao com sitio
		getEntityManager().createNativeQuery("Delete From sgctb_usuario_sgctb_sitio where sgctb_usuario_nu_usuario = ?")
			.setParameter(1,nu_usuario)
			.executeUpdate();
		
		//apagar o privilegio
		getEntityManager().createNativeQuery("Delete From sgctb_privilegio where nu_usuario = ?")
			.setParameter(1,nu_usuario)
			.executeUpdate();
		
		//apagar o log
		getEntityManager().createNativeQuery("Delete From sgctb_log where nu_usuario = ?")
			.setParameter(1,nu_usuario)
			.executeUpdate();
		getEntityManager().remove(u);
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> getList(Usuario usuarioLogado, Sitio sitioAtual) {
		//TODO nao seria melhor verificar com a hierarquia do perfil?
		return getEntityManager().createNativeQuery("select * from sgctb_usuario A, sgctb_privilegio B " +
				"where A.nu_usuario = B.nu_usuario and B.nu_sitio = ? and A.nu_hierarquia > ? order by B.nu_usuario",
				Usuario.class).setParameter(1,sitioAtual.getNuSitio()).setParameter(2,usuarioLogado.getNuHierarquia())
				.getResultList();
	}
	
	public Usuario procurarPorEmail(String email) {
		Query query = getEntityManager().createQuery("Select u From Usuario u where u.no_email = ?");
		query.setParameter(1, email);
		try {
			return (Usuario) query.getSingleResult();
		} catch (NoResultException e) {
			logger.error("Ocorreu o seguinte erro:",e);
			return null;
		}
	}
	
	public Usuario procurarPorHash(String hash) {
		Query query = getEntityManager().createQuery("Select u From Usuario u where u.hash = ?");
		query.setParameter(1, hash);
		try {
			return (Usuario) query.getSingleResult();
		} catch (NoResultException e) {
			logger.error("Ocorreu o seguinte erro:",e);
			return null;
		}
	}
	
	public Usuario procurarPorLogin(String coUsuario) {
		Query query = getEntityManager().createQuery("Select u From Usuario u where u.co_usuario = ?");
		query.setParameter(1, coUsuario);
		try {
			return (Usuario) query.getSingleResult();
		} catch(NoResultException e){
			return null;
		} catch (Exception e) {
			logger.error("Ocorreu o seguinte erro:",e);
			return null;
		}
	}
	
	public Usuario selectByEmail(String login) {
		Query q = getEntityManager().createQuery("Select u from Usuario u where u.no_email=?");
		q.setParameter(1,login);
		try{
			return (Usuario)q.getSingleResult();
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	public void atualizar(Usuario o) {
		getEntityManager().persist(o);
	}
}
